package org.gtesoreria

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import jxl.Sheet;
import jxl.Workbook;

import org.junit.internal.runners.statements.FailOnTimeout;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

class ImportadorService {

	def dateUtilsService
    static transactional = true

    def Map<Integer, String> importConsumos(String periodo, Proveedor pro, CommonsMultipartFile f) {
		Workbook workbook = Workbook.getWorkbook(f.inputStream)
		Sheet sheet = workbook.getSheet(0)
		def result = [:]
		/*
		 * LEGAJO|APELLIDO_NOMBRE|MONTO|FECHA|OBS
		 * 
		 */
		for (int r = 1; r < sheet.rows; r++) {
			try{
			 def legajo = sheet.getCell(0, r).contents
			 def apellidoNombre = sheet.getCell(1, r).contents.trim()
			 def monto = sheet.getCell(2, r).contents.trim()
			 def cuotas = sheet.getCell(3, r).contents.trim()
			 def observaciones = sheet.getCell(4, r).contents.trim()
			 def nroCuota = 1
			 
			 if(!legajo){
				 result.put(r,"ERROR Fila:" + r +" Legajo no puede ser vacio")
				 log.debug("ERROR Fila:" + r +" Legajo no puede ser vacio")
				 continue
			 } else if(!Afiliado.findByLegajo(legajo)) {
			 	result.put(r,"ERROR Fila:" + r +" Legajo no existente")
				log.debug("ERROR Fila:" + r +" Legajo no existente")
				continue
			 }
			 DateFormat formatter = new SimpleDateFormat("MM/yyyy");
			 def fecha = formatter.parse(periodo);
			 if(!monto) {
				 result.put(r,"ERROR Fila:" + r +" Monto no puede ser vacio")
				 log.debug("ERROR Fila:" + r +" Monto no puede ser vacio")
				 continue
			 } else {
			 	monto = Double.parseDouble(monto);
			 }
			 if(cuotas.trim().equals("") || cuotas.equals("1")){
				 cuotas = 1;
				 nroCuota = 1
			 } else {
			 	cuotas = Integer.parseInt(cuotas);
				monto = monto / cuotas; 
			 }
			 def consumoImportado
			 for(i in 1..cuotas){
				 consumoImportado = new Consumo(afiliado:Afiliado.findByLegajo(legajo),
					 proveedor:pro,
					 monto:monto,
					 fecha:fecha,
					 cantCuotas:cuotas,
					 observaciones:observaciones,
					 estado:Adelanto.A_DESCUENTO,
					 nroCuota:i).save(failOnError:true)
				 if(!consumoImportado){
				 		
				 		result.put(r,"ERROR Fila:" + r +" Error al guardar Consumo")
						log.debug "ERROR Fila:" + r +" Error al guardar Consumo"
				 }else {
				 	def consumosImportados = result.get("consumosImportados")
					if(consumosImportados == null) consumosImportados = new ArrayList<Consumo>()
					consumosImportados.add(consumoImportado)
					result.put("consumosImportados",consumosImportados)
				 	fecha =  dateUtilsService.getNextPeriodo(fecha);
				 	log.debug "Consumo ingresado correctamente:" + pro.nombre + " Afiliado: " + legajo + " monto: " + monto
				 }
			 }
			}catch(Exception pexc) {
			result.put(r,"ERROR Fila:" + r +" Formato invalido")
			log.debug "Exception importing"
			log.debug pexc.message;
			log.debug pexc.stackTrace
			continue
		}
		}
		workbook.close()
		return result;
    }
	
	def consumoService
	
	def Map<Integer, String> importConsumosFarmacia(String periodo, Proveedor farmacia, CommonsMultipartFile f) {
		Workbook workbook = Workbook.getWorkbook(f.inputStream)
		Sheet sheet = workbook.getSheet(0)
		def result = [:]
		Configuracion conf = consumoService.getConfiguracion();
		/*
		 * LEGAJO|APELLIDO_NOMBRE|A C AFILIADO|SUBSIDIO|OBS
		 *
		 */
		for (int r = 1; r < sheet.rows; r++) {
			try{
			 def legajo = sheet.getCell(0, r).contents
			 def apellidoNombre = sheet.getCell(1, r).contents.trim()
			 def cienporcien = sheet.getCell(2, r).contents.trim()
			 def acAfiliado = sheet.getCell(3, r).contents.trim()
			 def tipoConsumo = sheet.getCell(4, r).contents.trim()
			 def observaciones = sheet.getCell(5, r).contents.trim()
			 def subsidio = 0;
			 if(!legajo){
				 result.put(r,"ERROR Fila:" + r +" Legajo no puede ser vacio")
				 log.debug("ERROR Fila:" + r +" Legajo no puede ser vacio")
				 continue
			 } else if(!Afiliado.findByLegajo(legajo)) {
				 result.put(r,"ERROR Fila:" + r +" Legajo no existente")
				log.debug("ERROR Fila:" + r +" Legajo no existente")
				continue
			 }
			 
			 DateFormat formatter = new SimpleDateFormat("MM/yyyy");
			 def fecha = formatter.parse(periodo);
			 
			 if(!cienporcien) {
				 result.put(r,"ERROR Fila:" + r +" 100% MED no puede ser vacio")
				 log.debug("ERROR Fila:" + r +" 100% MED no puede ser vacio")
				 continue
			 } else {
				 cienporcien = Double.parseDouble(cienporcien);
			 }
			 
			 if(!acAfiliado) {
				 acAfiliado = 0
			 } else {
				 acAfiliado = Double.parseDouble(acAfiliado);
			 }
			 
			 if(!["PERFUMERIA", "MED SIN RECETA", "MED CON RECETA"].contains(tipoConsumo)){
				 result.put(r,"ERROR Fila:" + r +" TIPO CONSUMO posee un valor Invalido")
				 log.debug("ERROR Fila:" + r +" TIPO CONSUMO posee un valor Invalido")
				 continue
			 }
			 def tipo =""
			 double porcSubsidio = conf.porcSubsidio / 100
			 switch(tipoConsumo){
				 case "PERFUMERIA":
				 	acAfiliado = cienporcien
					subsidio = 0;
					tipo = "PERFUMERIA"
				 	break
				case "MED SIN RECETA":
					//acAfiliado = cienporcien - (porcSubsidio * cienporcien)
					subsidio = 0 
					tipo = "MED SIN RECETA"
					break
				case "MED CON RECETA":
					subsidio = (porcSubsidio * cienporcien)
					acAfiliado = acAfiliado
					tipo = "MED CON RECETA"
					break
					
			 }
			 
			 
			 def consumoImportado =  new ConsumoFarmacia(afiliado:Afiliado.findByLegajo(legajo),
				 proveedor:farmacia,
				 monto:cienporcien,
				 fecha:fecha,
				 cantCuotas:1,
				 observaciones:observaciones,
				 estado:Adelanto.A_DESCUENTO,
				 nroCuota:1,
				 aCargoAfiliado:acAfiliado,
				 subsidio:subsidio, 
				 tipo:tipo).save(failOnError:true)
			 if(!consumoImportado){
					 result.put(r,"ERROR Fila:" + r +" Error al guardar Consumo")
					log.debug "ERROR Fila:" + r +" Error al guardar Consumo"
			 }else {
				 def consumosImportados = result.get("consumosImportados")
				 if(consumosImportados == null) consumosImportados = new ArrayList<Consumo>()
				 consumosImportados.add(consumoImportado)
				 result.put("consumosImportados",consumosImportados)
				 log.debug "Consumo ingresado correctamente:" + farmacia.nombre + " Afiliado: " + legajo + " monto: " + (acAfiliado - subsidio)
			 }
			}catch(Exception pexc) {
				result.put(r,"ERROR Fila:" + r +" Formato invalido")
				log.debug "Exception importing"
				log.debug pexc.stackTrace
				continue
			}
		}
		workbook.close()
		return result;
	}
	
	def Map<Integer, String> importLugarTrabajo(InputStream f) {
		Workbook workbook = Workbook.getWorkbook(f)
		Sheet sheet = workbook.getSheet(0)
		 Map<Integer, String> result = new TreeMap<Integer, String>()
		/*
		 * CODIGO|NOMBRE|
		 *
		 */
		for (int r = 1; r < sheet.rows; r++) {
			 // get our fields
			 String codigo = sheet.getCell(0, r).contents.trim()
			  
			 String nombre = sheet.getCell(1, r).contents.trim()
			 
			 if(!codigo){
				 result.put(r,"ERROR Fila:" + r +" Codigo no puede ser vacio")
				 continue
			 } 
		 			 
			 if(! new LugarTrabajo(codigo:codigo, nombre:nombre).save(flush:true)){
				 result.put(r,"ERROR Fila:" + r +" Error al guardar LugarTrabajo")
				 log.debug "ERROR Fila:" + r +" Error al guardar LugarTrabajo"
			 }else{
			 	log.debug "New Lugar de Trabajo" + codigo + " - " + nombre;
			 }
		
		 
		}
		workbook.close()
		return result;
	}
	
	def Map<Integer, String> importAfiliados(CommonsMultipartFile f) {
		
		Workbook workbook = Workbook.getWorkbook(f.inputStream)
		Sheet sheet = workbook.getSheet(0)
		 Map<Integer, String> result = new TreeMap<Integer, String>()
		 try{
			 def delegadoAgoec = Afiliado.findByLegajo("0")
			/*
			 * LEGAJO|APELLIDONOMBRE|AFILIADO|DELEGADO|SEXO|FECHANAC|DOCN|CUIL|ESTADOCIVIL|CALLE|NUMERO|PISO|DEPTO|CP|LOCALIDAD|TELEFONO|CELULAR|BANCO|SUCURSAL|NROCUENTA|FECHAAFILIACION|FECHAINGRESO|CATEGORIA|OBSERVACIONES|CODLUGARTRABAJO|
			 *
			 */
			 for (int r = 1; r < sheet.rows; r++) {
				
				 def legajo = sheet.getCell(0, r).contents.trim()
				 def apellidoNombre = sheet.getCell(1, r).contents.trim()
				 def afiliado = "SI".equals(sheet.getCell(2, r).contents.trim())
				 def delegado = sheet.getCell(3, r).contents.trim()
				 def esDelegado = "SI".equals(sheet.getCell(4, r).contents.trim())
				 def sexo = sheet.getCell(5, r).contents.trim()
				 def fechaNacimiento = sheet.getCell(6, r).contents.trim()
				 def dni = sheet.getCell(7, r).contents.trim()
				 def cuil = sheet.getCell(8, r).contents.trim()
				 def estadoCivil = sheet.getCell(9, r).contents.trim()
				 def calle = sheet.getCell(10, r).contents.trim()
				 def numero = sheet.getCell(11, r).contents.trim()
				 def piso = sheet.getCell(12, r).contents.trim()
				 def depto = sheet.getCell(13, r).contents.trim()
				 def codigoPostal = sheet.getCell(14, r).contents.trim()
				 def localidad = sheet.getCell(15, r).contents.trim()
				 def telefono = sheet.getCell(16, r).contents.trim()
				 def celular = sheet.getCell(17, r).contents.trim()
				 def idNextel = sheet.getCell(18, r).contents.trim()
				 def banco = sheet.getCell(19, r).contents.trim()
				 def sucursal = sheet.getCell(20, r).contents.trim()
				 def numeroCuenta = sheet.getCell(21, r).contents.trim()
				 def fechaAfiliacion = sheet.getCell(22, r).contents.trim()
				 def fechaIngreso = sheet.getCell(23, r).contents.trim()
				 def categoria = sheet.getCell(24, r).contents.trim()
				 def observaciones = sheet.getCell(25, r).contents.trim()
				 def codLugarTrabajo = sheet.getCell(26, r).contents.trim()
				 
				 if("M".equals(sexo)){
				 	sexo = "Masculino"
				 } else if("F".equals(sexo)) {
				 	sexo = "Femenino"
				 }
				 DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
				 if(fechaAfiliacion)
				 	fechaAfiliacion = formatter.parse(fechaAfiliacion);
				 if(fechaIngreso)
				 	fechaIngreso = formatter.parse(fechaIngreso);
				 if(fechaNacimiento)
					 fechaNacimiento = formatter.parse(fechaNacimiento);
				 if(!"0".equals(delegado.trim()))
				 	delegado = Afiliado.findByLegajo(delegado)
				 else
				 	delegado = delegadoAgoec;
				 if(esDelegado)
				 	delegado = delegadoAgoec
				 def lugarTrabajo = LugarTrabajo.findByCodigo(codLugarTrabajo)
				 
				 if(!new Afiliado(legajo:legajo, apellidoNombre:apellidoNombre, dni:dni, cuil:cuil, delegado:delegado,
					 sexo:sexo,fechaNacimiento:fechaNacimiento, estadoCivil:estadoCivil, esDelegado:esDelegado,
					 calle:calle, numero:numero, departamento:depto, codigoPostal:codigoPostal,localidad:localidad,
					 telefon:telefono, celular:celular,
					 banco:banco, sucursal:sucursal, numeroCuenta:numeroCuenta,
					 fechaAfiliacion:fechaAfiliacion, fechaIngreso:fechaIngreso, categoria:categoria, observaciones:observaciones,
					 lugarTrabajo:lugarTrabajo).save(failOnError:true)){
				 		result.put(r,"ERROR Fila:" + r +" Error al guardar Afiliado");
						 log.debug "Error en fila: " + r;
					 }else{
			 			log.debug "Afiliado importado exitosamente. Fila: " + r;
					 }
			}
		 }catch(Exception exc) {
		 	log.debug exc.stackTrace;
		 }
		workbook.close()
		return result;
		 
	}
	
	
	def Map<Integer, String> importFamiliares(CommonsMultipartFile f) {
		
		Workbook workbook = Workbook.getWorkbook(f.inputStream)
		Sheet sheet = workbook.getSheet(0)
		 Map<Integer, String> result = new TreeMap<Integer, String>()
		 try{
			 
			/*
			 * LEGAJO|APELLIDONOMBRE|PARENTESCO|SEXO|FECHANAC|DOCN|
			 *
			 */
			 for (int r = 1; r < sheet.rows; r++) {
				
				 def legajo = sheet.getCell(0, r).contents.trim()
				 def apellidoNombre = sheet.getCell(1, r).contents.trim()
				 def parentesco = sheet.getCell(2, r).contents.trim()
				 def sexo = sheet.getCell(3, r).contents.trim()
				 def fechaNacimiento = sheet.getCell(4, r).contents.trim()
				 def dni = sheet.getCell(5, r).contents.trim()
				 
				 DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
				
				 if(fechaNacimiento)
					 fechaNacimiento = formatter.parse(fechaNacimiento);
				 def afiliado = Afiliado.findByLegajo(legajo)
				 if(!afiliado){
				 	log.debug("ERROR: Afiliado no existe legajo: " + legajo ); 
					continue;
				 } else {
				 	def familiar = new Familiar(nombreApellido:apellidoNombre, fechaNacimiento:fechaNacimiento, dni:dni, sexo:sexo, tipo:parentesco, afiliado:afiliado)
				 	if(!familiar){
						 result.put(r,"ERROR Fila:" + r +" Error al guardar Familiar");
						 log.debug "Error en fila: " + r;
					 } else {
						 log.debug "Familiar importado exitosamente. Fila: " + r;
						 afiliado.familiars.add(familiar)
						 afiliado.save(flush:true)
					 }
				 }
			}
		 }catch(Exception exc) {
			 log.debug exc.stackTrace;
		 }
		workbook.close()
		return result;
		 
	}
	def adelantoService
	
	def Map<Integer, String> importAdelantos(Date periodo, CommonsMultipartFile f) {
		Workbook workbook = Workbook.getWorkbook(f.inputStream)
		Sheet sheet = workbook.getSheet(0)
		Map<Integer, String> result = new TreeMap<Integer, String>()
		/*
		 * LEGAJO|APELLIDONOMBRE|ADELANTO|ENTREGO|OBSERVACIONES
		 *
		 */
		try {
			for (int r = 1; r < sheet.rows; r++) {
				 // get our fields
				 def legajo = sheet.getCell(0, r).contents.trim()
				 def apellidoNombre = sheet.getCell(1, r).contents.trim()
				 def adelanto = sheet.getCell(2, r).contents.trim()
				 def entrego = sheet.getCell(3, r).contents.trim()
				 def observaciones = sheet.getCell(4, r).contents.trim()
				 
				 if(!legajo){
					 result.put(r,"ERROR Fila:" + r +" Legajo no puede ser vacio")
					 continue
				 }
				 if(!adelanto){
					 result.put(r,"ERROR Fila:" + r +" Monto del adelanto no puede ser vacio")
					 continue
				 }else {
					 adelanto = Double.parseDouble(adelanto);
				 }
				 def afiliado = Afiliado.findByLegajo(legajo)
				 if(!afiliado){
					 result.put(r,"ERROR Fila:" + r +" Legajo " + legajo + " no existe en sistema.")
					 continue
				 }
				 /*Adelanto adelantoPrevious = adelantoService.getByAfiliadoAndPeriodo(afiliado, periodo)
				 if(adelantoPrevious){
					 adelantoPrevious.montoTotal +=adelanto
					 adelanto.observaciones += " - " + observaciones
				 }*/
				 if(entrego)
				 	entrego = Afiliado.findByLegajo(entrego)
				 else
				 	entrego = Afiliado.findByLegajo("0")
				 if(! new Adelanto(afiliado:afiliado, 
					 montoTotal:adelanto, 
					 entrego:entrego, 
					 observaciones:observaciones,
					 fechaOtorgamiento:null,
					 fechaPago:null,
					 fechaPedido:periodo,
					 estado:Adelanto.SOLICITADO).save(flush:true)){
					 result.put(r,"ERROR Fila:" + r +" Error al guardar Adelanto")
					 log.debug "ERROR Fila:" + r +" Error al guardar Adelanto"
				 }else{
					 log.debug "New Adelanto" + legajo + " - " + adelanto;
				 }
			}
		}catch(Exception exc) {
			log.debug exc.stackTrace;
		}
		workbook.close()
		return result;
	}
	
}
